/*
给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。

有效字符串需满足：

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
*/
#include <stdio.h>

#define BUFFER_SIZE 32
#define SIZE 6
int isValid(char * s)
{
    /* 定义一个数组作为栈 */
    char stack[BUFFER_SIZE];
    char array[SIZE] = { 0 };
    array['('] = ')';    // 映射左括号'('到右括号')'
    array['{'] = '}';    // 映射左括号'{'到右括号'}'
    array['['] = ']';

    if (s == NULL)
    {
        return 0;
    }
    /* 栈顶指针 */
    int top = -1;
    for (int idx = 0; s[idx] != '\0'; idx++)
    {
        /* 如果是左括号就入栈 */
        if (s[idx] == '(' || s[idx] == '{' || s[idx] == '[')
        {
            ++top;
            stack[top] = s[idx];
        }
        else if (s[idx] == ')' || s[idx] == ']' || s[idx] == '}')
        {
            if (top == -1 || s[idx] != array[stack[top]])
            {
                return 0;
            }
            /* 匹配就出栈 */
            top--;
        }
    }
    return top == -1 ? 1 : 0;
}

int main()
{
    char s1[] = "()";
    char s2[] = "()[]{";
    char s3[] = "([])";

    printf("%d\n", isValid(s1));
    printf("%d\n", isValid(s2));
    printf("%d\n", isValid(s3));

}



